Lab XX - Laboratoria problemowe 3

Lab. XX - Laboratorium problemowe 3 - “Robot kurierski na przejściu dla pieszych”

Robot dostawczy czekający na chodniku przed przejściem dla pieszych z sygnalizacją świetlną.

1. Laboratoria problemowe

W ramach laboratorium problemowego stawiany jest przed Państwem problem, zagadnienie, które wymaga pracy własnej, szukania rozwiązań, kreatywnego podejścia.

Efektem tego laboratorium nie musi być rozwiązanie problemu. Skupiamy się tutaj na możliwych podejściach, rozważaniu co może zadziałać a co nie zadziała, jakie potencjalne problemy możemy napotkać.

Wynikiem końcowym ma być krótki raport (więcej na dole instrukcji) oraz ewentualnie program realizujący rozwiązanie problemu. Raport będzie oceniany jak standardowe zadanie domowe, natomiast za implementację możliwe jest do uzyskania dodatkowo do 5 punktów.

2. Problem

Dany jest robot kurierski (dostawczy), podobny do robotów, które rozwożą przesyłki po chodnikach. Robot ma napęd różnicowy i jest wyposażony w: - kamerę RGB skierowaną do przodu, - lidar 3D o 16 warstwach (360° w poziomie, ±15° w pionie, zasięg 30 m), - IMU oraz odometrię kół.

Robot stoi na chodniku przed przejściem dla pieszych z sygnalizacją świetlną. Jego zadaniem jest przejechać na drugą stronę ulicy, do punktu docelowego na przeciwległym chodniku. Przejazd musi być bezpieczny i zgodny z przepisami, czyli robot: - wjeżdża na jezdnię tylko przy ciągłym zielonym świetle dla pieszych, - porusza się po pasach, - nie zderza się z pieszymi, którzy chodzą po chodnikach i również korzystają z przejścia, - nie zderza się z samochodami.

UWAGA! Zdarza się, że samochód przejeżdża na czerwonym świetle, kiedy dla pieszych pali się zielone. Kierowcy nie hamują przed robotem.

Geometria otoczenia (położenie jezdni, przejścia i punktu docelowego) jest znana i opisana w punkcie 4. Robot nie zna natomiast stanu sygnalizacji ani położeń pieszych i samochodów - musi je określić na podstawie własnych czujników. W szczególności stan sygnalizacji należy rozpoznać z obrazu z kamery.

Zadanie powinno być realizowane jako akcja, której celem jest przejazd na drugą stronę ulicy, a wynikiem informacja, czy przejazd się udał.

3. Przygotowanie środowiska

Przed przystąpieniem do pracy należy przygotować środowisko: Instrukcja przygotowania środowiska do zajęć. Obraz bazuje na osrf/ros:jazzy-desktop-full (ROS 2 Jazzy Jalisco) z symulatorem Gazebo Harmonic. Podczas budowania obrazu pobierane są modele 3D (samochody, piesi, drzewa) z Gazebo Fuel, więc pierwsze budowanie może chwilę potrwać.

Domyślnie kontener nosi nazwę ARM_XX.

UWAGA! Skrypty po uruchomieniu usuwają kontener o takiej nazwie przed utworzeniem nowego.

Korzystanie z kontenera

Po każdym ponownym uruchomieniu komputera, proszę pamiętać o wywoływaniu:

xhost +local:root

Nowy terminal można dołączyć do kontenera korzystając z polecenia:

docker exec -it ARM_XX bash

Komunikacja w sieci

W tym obrazie ROS 2 i Gazebo domyślnie komunikują się tylko w obrębie jednego komputera (w pliku ~/.bashrc ustawione są zmienne ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST i GZ_IP=127.0.0.1). Dzięki temu symulacje różnych osób w tej samej sieci lokalnej się nie mieszają i nie trzeba ustawiać zmiennej ROS_DOMAIN_ID.

Jeżeli program ma działać na innym komputerze niż symulacja (np. na własnym laptopie), w terminalach na obu komputerach należy zezwolić na komunikację w sieci i ustawić tę samą, unikalną wartość ROS_DOMAIN_ID z zakresu 0-100:

export ROS_AUTOMATIC_DISCOVERY_RANGE=SUBNET
export ROS_DOMAIN_ID=10  # przykładowa wartość

Sugerowane jest użycie dwóch ostatnich cyfr numeru IP komputera jako wartości ROS_DOMAIN_ID, aby uniknąć konfliktów z innymi użytkownikami w sieci. Aby sprawdzić swój adres IP, można użyć polecenia:

ip addr show

Jeżeli na jednym komputerze działa kilka symulacji (np. w kilku kontenerach), można je dodatkowo rozdzielić, ustawiając w każdym kontenerze inną wartość zmiennej GZ_PARTITION (węzły Gazebo widzą się nawzajem tylko w obrębie tej samej partycji). Wartość musi być taka sama we wszystkich terminalach, w których korzysta się z danej symulacji, dlatego najlepiej dopisać ją do pliku ~/.bashrc:

echo 'export GZ_PARTITION=<wybrana_nazwa>' >> ~/.bashrc  # np. arm_10

4. Uruchomienie symulacji

Symulację z paczki crosswalk_sim (repozytorium arm_crosswalk_sim) można uruchomić poleceniem

cd /arm_ws
source install/setup.bash
ros2 launch crosswalk_sim sim.launch.py
Zrzut ekranu symulacji

Pierwsze uruchomienie może trochę potrwać, wymagana jest odrobina cierpliwości.

Razem z symulacją uruchamiany jest RViz z obrazem z kamery, chmurą punktów z lidaru i mapą ulicy. Można go wyłączyć argumentem rviz:=false, a okno Gazebo argumentem gui:=false (czujniki nadal działają). W oknie Gazebo, po prawej stronie, widoczny jest obraz z kamery robota.

Świat

Sygnalizator dla pieszych, który powinien obserwować robot, stoi po drugiej stronie ulicy (x ≈ -2,6 m). Czerwone światło jest u góry, zielone u dołu:

Sygnalizator dla pieszych: czerwone i zielone światło

Cykl sygnalizacji (wartości domyślne): - zielone dla samochodów: 25 s, - żółte dla samochodów: 3 s, - czerwone dla wszystkich: 2 s, - zielone dla pieszych: 12 s, - migające zielone dla pieszych: 4 s (nie należy już wjeżdżać na przejście), - czerwone dla wszystkich: 2 s, - czerwone z żółtym dla samochodów: 1,5 s.

Czujniki i sterowanie

Topic Typ Opis
/camera/image_raw sensor_msgs/msg/Image kamera RGB, 640×480, 15 Hz
/camera/camera_info sensor_msgs/msg/CameraInfo parametry kamery
/lidar/points sensor_msgs/msg/PointCloud2 lidar 3D, 16 warstw × 900 punktów, 10 Hz, pola x y z intensity ring
/scan sensor_msgs/msg/LaserScan środkowa warstwa lidaru jako skan 2D
/imu sensor_msgs/msg/Imu 100 Hz
/odom nav_msgs/msg/Odometry odometria kół, 30 Hz
/cmd_vel geometry_msgs/msg/Twist sterowanie robotem (maks. 1,6 m/s i 2 rad/s)

W odróżnieniu od TurtleBota3 z poprzednich zajęć, robot przyjmuje na topicu /cmd_vel wiadomości geometry_msgs/msg/Twist. Robotem można sterować z klawiatury:

ros2 run teleop_twist_keyboard teleop_twist_keyboard
RViz z chmurą punktów z lidaru 3D

Scenariusze i parametry

Natężenie ruchu pieszych i samochodów oraz częstość przejazdów na czerwonym świetle można zmieniać. Dostępne są gotowe scenariusze easy (mały ruch, bez przejazdów na czerwonym), default, hard (duży ruch, częste przejazdy na czerwonym, piesi przechodzący na czerwonym) oraz runner_test (przejazd na czerwonym w każdym cyklu świateł):

ros2 launch crosswalk_sim sim.launch.py scenario:=hard

Pojedyncze parametry można nadpisać argumentem params, a argument seed pozwala powtórzyć ten sam przebieg symulacji:

ros2 launch crosswalk_sim sim.launch.py seed:=42 params:="red_runner.probability=0.8 red_runner.window=[2,6] pedestrians.crossing_rate=15"

Najważniejsze parametry: - pedestrians.crossing_rate / pedestrians.sidewalk_rate - liczba pieszych na minutę, którzy przechodzą przez ulicę / idą wzdłuż chodnika, - cars.rate - liczba samochodów na minutę na każdym pasie, - red_runner.probability - prawdopodobieństwo, że w danym cyklu świateł któryś samochód przejedzie na czerwonym, - red_runner.window - przedział czasu (w sekundach, liczony od zapalenia się zielonego dla pieszych), w którym taki samochód dojeżdża do przejścia.

Pełna lista parametrów znajduje się w pliku default.yaml.

Sędzia i topici /debug

Symulacja ocenia każdą próbę przejazdu. W terminalu, w którym uruchomiono symulację, wypisywane są zdarzenia: - wjazd na jezdnię (wraz ze stanem świateł), - naruszenia przepisów (wjazd na czerwonym, zjazd poza pasy), - zderzenia z samochodami i pieszymi, - sytuacje, w których samochód przejechał bardzo blisko robota, - wynik przejazdu (SUCCESS lub FAILED).

Piesi i samochody nie mają fizycznych kolizji - przejeżdżają przez robota, a zderzenie jest zgłaszane przez sędziego.

Kolejną próbę można rozpocząć bez restartowania symulacji. Poniższe polecenie przenosi robota z powrotem na pozycję startową:

ros2 topic pub --once /crosswalk/reset std_msgs/msg/Empty

Topici z prefiksem /debug/ zawierają informacje niedostępne dla prawdziwego robota: stan świateł, położenia wszystkich pieszych i samochodów, zdarzenia sędziego. Rozwiązanie nie może z nich korzystać. Można ich natomiast używać do sprawdzania dokładności proponowanego systemu, np. porównując rozpoznany stan świateł z /debug/crosswalk/ground_truth/pedestrian_light, a wyniki przejazdów odczytując z /debug/crosswalk/events.

5. Zadanie do samodzielnej realizacji

W ramach zajęć należy zaproponować sposób rozwiązania problemu postawionego w punkcie 2.

Efektem ma być przygotowanie raportu, który będzie zawierał proponowaną strukturę programu (wraz z node’ami i topicami, które będą one wymieniać), paczki z sieci, które można wykorzystać do realizacji zadania oraz opis potencjalnych problemów, na które można napotkać. W raporcie warto odnieść się w szczególności do: - rozpoznawania stanu sygnalizacji na podstawie obrazu z kamery, - wykrywania i śledzenia pieszych i samochodów, - podejmowania decyzji o wjeździe na jezdnię, - zachowania robota w sytuacjach niebezpiecznych, np. gdy samochód przejeżdża na czerwonym świetle, a robot jest już na jezdni.

Raport powinien mieć następujące elementy:

Program

Opcjonalnie, można również przygotować program realizujący postawione zadanie (wraz z jego opisem w ramach raportu). Za implementację można otrzymać dodatkowo do 5 punktów. Działanie programu warto sprawdzić w scenariuszach easy, default i hard.


Autor: Kamil Młodzikowski